package zhibi.fast.ueditor.hunter;

import org.apache.commons.io.FileUtils;
import zhibi.fast.ueditor.PathFormat;
import zhibi.fast.ueditor.define.AppInfo;
import zhibi.fast.ueditor.define.BaseState;
import zhibi.fast.ueditor.define.MultiState;
import zhibi.fast.ueditor.define.State;

import java.io.File;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;

/**
 * @author 执笔
 * @date 2019/4/30 10:45
 */
public class FileManager {

    private String   dir        = null;
    private String   rootPath   = null;
    private String[] allowFiles = null;
    private int      count      = 0;
    private String   urlPrefix;

    public FileManager(Map<String, Object> conf) {
        this.rootPath = (String) conf.get("rootPath");
        this.urlPrefix = (String) conf.get("urlPrefix");
        this.dir = this.rootPath + (String) conf.get("dir");
        this.allowFiles = this.getAllowFiles(conf.get("allowFiles"));
        this.count = (Integer) conf.get("count");
    }

    public State listFile(int index) {
        File  dir   = new File(this.dir);
        State state = null;
        if (!dir.exists()) {
            return new BaseState(false, AppInfo.NOT_EXIST);
        }
        if (!dir.isDirectory()) {
            return new BaseState(false, AppInfo.NOT_DIRECTORY);
        }
        Collection<File> list = FileUtils.listFiles(dir, this.allowFiles, true);
        if (index < 0 || index > list.size()) {
            state = new MultiState(true);
        } else {
            Object[] fileList = Arrays.copyOfRange(list.toArray(), index, index + this.count);
            state = this.getState(fileList);
        }
        state.putInfo("start", index);
        state.putInfo("total", list.size());
        return state;

    }

    private State getState(Object[] files) {
        MultiState state     = new MultiState(true);
        BaseState  fileState = null;
        File       file      = null;
        for (Object obj : files) {
            if (obj == null) {
                break;
            }
            file = (File) obj;
            fileState = new BaseState(true);
            fileState.putInfo("url", PathFormat.format(urlPrefix + this.getPath(file)));
            state.addState(fileState);
        }
        return state;
    }

    private String getPath(File file) {
        String path = file.getAbsolutePath();
        return path.replace(this.rootPath, "/");

    }

    private String[] getAllowFiles(Object fileExt) {
        String[] exts = null;
        String   ext  = null;
        if (fileExt == null) {
            return new String[0];
        }
        exts = (String[]) fileExt;
        for (int i = 0, len = exts.length; i < len; i++) {
            ext = exts[i];
            exts[i] = ext.replace(".", "");
        }
        return exts;
    }

}
